import { defineStore } from 'pinia';
//引入token相关处理
import { getToken, removeToken, setToken } from '../utils/token-utils';
import type {userInfoReturnType,userTokenParamsType} from '@/api/userInfo'
//引入请求
import {requestUserToken,requestUserInfo,requestLogout} from '@/api/userInfo'
import type { RouteRecordRaw } from 'vue-router';
import { staticRoutes } from '@/router/routes';

/**
 * 用户信息
 * @methods setUserInfos 设置用户信息
 */

//定义登录信息的小仓库类型
export interface UserInfoState{
  token:string;
  userInfo:userInfoReturnType;
  menuRoutes:RouteRecordRaw[]
}

export const useUserInfoStore = defineStore('userInfo', {

   	state: (): UserInfoState => ({
    token: (getToken() as string) || "",
    //参数定义换成api中已定义的数据
    userInfo:{
      routes: [],
      buttons: [],
      roles:  [],
      name: '',
      avatar: '',
    },
    menuRoutes: staticRoutes
  }),

	actions: {
    //请求参数改成一个对象，因为传递的值修改为一个对象了
    //就是api中定义的那个
   async login(userTokenParams:userTokenParamsType) {
       try{
         //发送请求
         const result = await requestUserToken(userTokenParams);
         //把token 设置给state里面
         this.token = result.token;
         setToken(this.token)
       }catch(e){
        //如果出错，在触发这个函数的地方处理
        return Promise.reject(e);
       }
    },

    //获取用户信息的请求
   async getInfo () {
      try{
        //拿到token后，在拦截器中设置给请求头，让每次请求携带token，这里获取用户信息
        const result = await requestUserInfo()
        //把值设置给
        this.userInfo = result
      }catch(e){
        //如果出错，在触发这个函数的地方处理
        return Promise.reject(e)
      }
    },


   //退出登录的请求
    async Logout(){
      try{
        //退出登录请求
        await requestLogout()
        //清空state中保存的信息，直接重置数值
        this.reset()
      }catch(e){
        return Promise.reject(e)
      }
    },


    reset () {
      // 删除local中保存的token
      removeToken()
      // 提交重置用户信息的mutation
      this.token = '';
      this.userInfo={
      routes: [],
      buttons: [],
      roles:  [],
      name: '',
      avatar: '',
      };
    },
	},
});
